#include <iostream>
#include "../../Encriptacion/RSA.h"
using namespace Encriptacion;

#include <../lib/igloo/igloo.h>
using namespace igloo;
Context(testRSA)
{

	RSA* encriptador;
	string pathDelArchivoAEncriptar;
	string pathDelArchivoEncriptado;
	string pathDelArchivoDesencriptado;
	string nombreDelAdmin;

	void SetUp() {
		encriptador = new RSA();
		pathDelArchivoAEncriptar = "ArchivoAEncriptar.txt";
		pathDelArchivoEncriptado = "";
		pathDelArchivoDesencriptado = "";
		nombreDelAdmin = "mariano";
		fstream archivoAEncriptar;
		archivoAEncriptar.open(pathDelArchivoAEncriptar.c_str(), ios::in | ios::out | ios::trunc);

		archivoAEncriptar << "abcdefghijklmnopqrstuvwxyz";
		archivoAEncriptar << "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		archivoAEncriptar << "0123456789";

		archivoAEncriptar.close();

	}

	void TearDown() {
		delete encriptador;
		remove(pathDelArchivoAEncriptar.c_str());
		remove(pathDelArchivoEncriptado.c_str());
		remove(pathDelArchivoDesencriptado.c_str());
	}

	Spec(testearMaximoComunDivisor) {

		unsigned long long a = encriptador->obtenerMaximoComunDivisor(1, 2);
		unsigned long long b = encriptador->obtenerMaximoComunDivisor(50, 100);
		unsigned long long c = encriptador->obtenerMaximoComunDivisor(24, 18);
		unsigned long long d = encriptador->obtenerMaximoComunDivisor(157, 2668);
		unsigned long long e = encriptador->obtenerMaximoComunDivisor(48357, 941718);

		Assert::That(a, Is().EqualTo(1));
		Assert::That(b, Is().EqualTo(50));
		Assert::That(c, Is().EqualTo(6));
		Assert::That(d, Is().EqualTo(1));
		Assert::That(e, Is().EqualTo(3));
	}

	Spec(testearExponenciacionModular) {

		unsigned long long a = encriptador->exponenciacionModular(12, 26, 23);
		unsigned long long b = encriptador->exponenciacionModular(300, 15, 500);
		unsigned long long c = encriptador->exponenciacionModular(8, 4, 32);
		unsigned long long d = encriptador->exponenciacionModular(12228, 76, 15000);

		Assert::That(a, Is().EqualTo(13));
		Assert::That(b, Is().EqualTo(0));
		Assert::That(c, Is().EqualTo(0));
		Assert::That(d, Is().EqualTo(14496));
	}

	Spec(testearAlgoritmoExtendidoDeEuclides) {

		unsigned long long a = encriptador->algoritmoExtendidoDeEuclides(157, 2668);
		unsigned long long b = encriptador->algoritmoExtendidoDeEuclides(550, 1759);
		unsigned long long c = encriptador->algoritmoExtendidoDeEuclides(321, 2668);

		Assert::That(a, Is().EqualTo(17));
		Assert::That(b, Is().EqualTo(355));
		Assert::That(c, Is().EqualTo(2161));
	}

	Spec(testearRSA) {

		string pathDeLasClaves = encriptador->generarParDeClaves(nombreDelAdmin);
		string pathDelArchivoEncriptado = encriptador->encriptarArchivo(nombreDelAdmin, "ArchivoAEncriptar.txt", "Test");
		string pathDelArchivoDesencriptado = encriptador->desencriptarArchivo(nombreDelAdmin, "ArchivoEncriptadoTest.txt");
	}

};
